/*  Test of prefix operator.  Ben Moszkowski  12 Aug 85 */


/* set(future_asgn_flag,false). */

simple_test:-
  length(3),prefix(( length(5) ,# write(1) )) .

gets_test:-
    I=1,
    prefix((I gets 2*I ,length(10))) ,
    halt(I=16),
    #write('I='),#write(I) .

list_length(L,N):-L=[],true,N=0.
list_length(L,N):-L=[_|T],list_length(T,N0),N=N0+1.

sum_test(T) :-
	    Tree=T ,Status=[],
	    prefix(sum_tree(Status,Tree)),
	    halt(list_length(Status,1)),
	    #write('Status='),#write(Status),
	    #write(' Tree='),#write(Tree) .

sum_tree(Status,Tree) :-
    sum_tree_body(Status,Tree)&
	skip ,Status <- [true] ,stable(Tree).

sum_tree_body(Status,Tree) :-
    if (Tree = [Left,Right]) then (
    	keep(Tree=[Left,Right]),
    	(
	sum_subtree(Status,Left,Right)&
	sum_subtree(Status,Right,Left)&
	(
	    skip ,Tree<- Left+Right ,stable(Status)
	))
    ) else (
	if Tree > 0 then empty
	else (   % emergency stop :-)
	    skip ,Status<-[false] ,stable(Tree)
	)
    )
.

/* Sum the i-th subtree.  Keep the other subtree stable */
sum_subtree(Status,Tree,Rest):-
    sum_tree_body(Status,Tree) ,stable(Rest) .


sum_test1 :- sum_test([[[1,1],[1,1]],[[1,1],[1,1]]]).
sum_test2 :- sum_test([[[1,1],[1,1]],[[0,1],[1,1]]]).

